/* eslint-disable @typescript-eslint/no-unused-vars */
/**
 * tools: https://www.jsonschemavalidator.net/
 */
export interface TypeCommon {
	//	数据枚举	必须是数组，而且数组里面的元素至少必须有一个而且不能有重复值。	当json实例的值存在于enum列表中时，通过验证
	enum?: any[];
	//	定义类型	可以是字符串或者字符串数组，取值必须在JSON基本类型范围内	校验JSON实例的类型是否符合定义（如果type的值是一个string，则其值只能是以下几种：null、boolean、object、array、number、string、integer。如果type的值是一个数组，则数组中的元素都必须是string，且其取值依旧被限定为以上几种。只要带校验JSON元素是其中的一种，则通过校验。）
	type?: string | string[];
	//数据验证	必须是Schema实例对象数组，而且数组里面的元素至少必须有一个而且不能有重复	JSON实例满足其中所有的Schema时，通过验证
	allOf?: SchemaInfo[];
	//	数据验证	同allOf	JSON实例满足其中某一个Schema时，通过验证
	anyOf?: SchemaInfo[];
	//数据验证	同allOf	JSON实例刚好只满足其中某一个Schema时，通过验证
	oneOf?: SchemaInfo[];
	//数据验证	必须是个有效的Schema实例对象	如果不满足JSON Schema的定义，则通过验证
	not?: SchemaInfo;
	//数据验证	JSON基本类型	如果JSON实例的值和该关键字指定的值相同，则通过校验。
	const?: any;
	//提示作用，不会产生任何实质性的影响。指定待校验JSON元素的默认值，当然，这个默认值最好是符合要求的，即能够通过相应的JSON Schema的校验
	default?: any;
}
export interface TypeString {
	//最大长度	大于等于0的整数	字符串的长度必须小于等于该值
	maxLength?: number;
	//最小长度	大于等于0的整数	字符串的长度必须大于等于该值
	minLength?: number;
	//模式	字符串，必须是有效的正则表达式	当字符串符合正则表达式时，通过验证
	pattern?: RegExp;
	//格式校验，date、date-time（时间格式）、email（邮件格式）、hostname（网站地址格式）、ipv4、ipv6、uri等等。see(https://python-jsonschema.readthedocs.io/en/latest/validate/#validating-formats)
	format?: string;
}
export interface TypeNumber {
	//整数倍	大于0的JSON数	当JSON实例的值是其整数倍的时候，通过验证
	multipleOf?: number;
	//最大值	一个JSON数	当JSON实例的值小于等于maximum的时候，通过验证
	maximum?: number;
	//包含最大值	布尔值，必须与maximum一起使用	当其为true的时候，JSON实例不能等于maximum的值
	exclusiveMaximum?: number;
	//最小值	一个JSON数	当JSON实例的值大于等于minimum的时候，通过验证
	minimum?: number;
	//包含最小值	布尔值，必须与minimum一起使用	当其为true的时候，JSON实例不能等于minimum的值
	exclusiveMinimum?: number;
}
export interface TypeArray {
	//定义元素	必须是Schema实例对象或者Schema实例对象的数组	用于定义array中的元素类型
	items?: SchemaItem | SchemaItem[];
	//额外项校验	布尔值或Schema实例对象	当items为Schema实例的数组，additionalItems为false时，json数据长度必须小于等于items长度，如果additionalItems是Schema实例，则items 关键字指定的Schema实例数组没有匹配到的其他元素都要符合该实例
	additionalItems?: boolean | SchemaInfo;
	//长度限制	大于等于0的整数	array实例的长度必须小于等于maxItems的值
	maxItems?: number;
	//长度限制	大于等于0的整数	array实例的长度必须大于等于minItems的值
	minItems?: number;
	//唯一值	布尔值，默认值false	当uniqueItems为true的时候，array实例不能有重复值。
	uniqueItems?: boolean;
}
export interface TypeObject {
	//属性	属性的值必须都是有效的Schema实例对象	用于定义属性列表
	properties?: SchemaItem;
	//必须属性	字符串数组，至少必须有一个元素，数组内不能有重复值	object实例必须有所有required定义的属性
	required?: string[];
	//最大属性个数	大于等于0的整数	object实例的属性个数必须小于等于maxProperties的值
	maxProperties?: number;
	//最小属性个数	大于等于0的整数	object实例的属性个数必须大于等于minProperties的值
	minProperties?: number;
	//按属性名校验	必须是有效的Schema实例对象	Schema实例的每一个属性的键都是一个正则表达式，值都是一个Schema实例。 指定符合正则表达式的属性的校验规则。
	patternProperties?: object;
	//额外属性校验	Schema实例对象或布尔值	为false时不允许拥有除了properties和patternProperties匹配到的属性外的属性，如果为Schema实例，则没有匹配到的属性要符合该Schema
	additionalProperties?: object;
}
export interface ValidForm extends TypeObject, TypeString, TypeNumber, TypeCommon, TypeArray {}

export interface SchemaInfo extends ValidForm {
	//指定JSON Schema版本信息，例一中指定的版本为：draft-04。该关键字是可以省略的，当前最新版本为draft-07。注意：该关键字的值必须使用官方提供的值，不能自己随便写。
	$schema?: string;
	title: string;
	description: string;
}

//一个标准schema对象，key=字段，内容为字段信息
export interface SchemaItem {
	[key: string]: SchemaInfo | any;
}

//一个页面schema编辑表单
export interface SchemaFrom extends ValidForm {
	key: string;
	title: string;
	description?: string;
	type?: string;
	valid?: boolean;
	rules?: [];
	path?: string;
	parent?: string;
	pathName?: string;
}

export interface Profile {
	profile: string;
	description?: string;
	props: {
		basic: {
			sn: string;
			name: string;
			gatewaySn: string;
			productModel: string;
			groupId: string;
			type: string;
			isOnline: boolean;
			createTime: string;
			registerTime: string;
			loginTime: string;
			logoutTime: string;
			lastLiveTime: string;
			description: string;
			[key: string]: any;
		};
		platform?: object;
		system?: object;
		sensor: object;
		config: object;
	};
	funcs: object;
}
